// 文件名：array_lookup_table.cpp
// 目的：在编译期构建 ASCII 数字字符查表，以 O(1) 高速判断字符是否为数字。
// 设计：
//   - isDigitConstexpr：纯 constexpr 判断（无运行时分支）；
//   - buildAsciiDigitTable：生成 256 长度的布尔表，标记 '0'..'9' 为 true；
//   - kIsDigit：全局 constexpr 表（放在只读数据段）；
//   - fastIsDigit：对 char 做无符号提升后查表，避免符号扩展带来的负索引问题。
// 优势：
//   - 编译期计算，运行时零开销查表；
//   - 避免 std::isdigit 在不同本地化设置下的行为差异（此处仅针对 ASCII）。
// 注意：
//   - 对 char 必须先转换为 unsigned char 再作为索引，避免 UB。
//   - 若需 Unicode，请使用专门库（本示例仅覆盖单字节 ASCII）。

#include <array>
#include <iostream>
#include <string>

// 纯字面量比较，满足 constexpr 要求
constexpr bool isDigitConstexpr(unsigned char c) {
    return c >= '0' && c <= '9';
}

// 编译期构建 256 项的查找表
constexpr std::array<bool, 256> buildAsciiDigitTable() {
    std::array<bool, 256> table{};
    for (int i = 0; i < 256; ++i) {
        table[static_cast<std::size_t>(i)] = isDigitConstexpr(static_cast<unsigned char>(i));
    }
    return table;
}

constexpr auto kIsDigit = buildAsciiDigitTable();

// 运行时快速判断：查表 O(1)
bool fastIsDigit(char c) {
    return kIsDigit[static_cast<unsigned char>(c)];
}

int main() {
    std::string samples = "abc123!?0";
    std::cout << "Digits in \"" << samples << "\": ";
    for (char ch : samples) {
        if (fastIsDigit(ch)) {
            std::cout << ch << ' ';
        }
    }
    std::cout << '\n';
    return 0;
}